/**  
* @Title: AuthenticationInterceptor.java 
* @Description:
* @Copyright: Copyright (c) 2018
* @Company:http://www.sinocon.cn
* @author Administrator  
* @date 2018年3月29日  
* @version 1.0  
*/
package com.yuanlinsu.project.system.interceptor;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.github.pagehelper.util.StringUtil;
import com.yuanlinsu.project.system.annotation.Access;

/**
 * @Title: AuthenticationInterceptor
 * @Description:
 * @author:Administrator
 * @date 2018年3月29日
 */
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {

	/*
	 * (non-Javadoc)
	 * 
	 * <p>Title: preHandle</p>
	 * 
	 * <p>Description: </p>
	 * 
	 * @param request
	 * 
	 * @param response
	 * 
	 * @param handler
	 * 
	 * @return
	 * 
	 * @throws Exception
	 * 
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#
	 * preHandle(javax.servlet.http.HttpServletRequest,
	 * javax.servlet.http.HttpServletResponse, java.lang.Object)
	 * 
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 将handler强转为HandlerMethod, 前面已经证实这个handler就是HandlerMethod
		HandlerMethod handlerMethod = (HandlerMethod) handler;
		// 从方法处理器中获取出要调用的方法
		Method method = handlerMethod.getMethod();

		// 获取出方法上的Access注解
		Access access = method.getAnnotation(Access.class);
		if (access == null) {
			// 如果注解为null, 说明不需要拦截, 直接放过
			return true;
		}
		if (access.login()) {
			// TODO 1.检查登录情况,如果没有登录则需要登录后才能操作
			System.out.println("这里必须要登录的哇。。。。。");
//			return false;
		}

		if (access.authorities().length > 0) {
			// 如果权限配置不为空, 则取出配置值
			String[] authorities = access.authorities();
			Set<String> authSet = new HashSet<>();
			for (String authority : authorities) {
				// 将权限加入一个set集合中,方便后边进行包含验证
				authSet.add(authority);
			}
			// TODO 这里我为了方便是直接参数传入权限, 在实际操作中应该是从参数中获取用户Id到数据库权限表中查询用户拥有的权限集合,
			String role = request.getParameter("role");

			// 与set集合中的权限进行对比完成权限校验
			if (StringUtil.isNotEmpty(role)) {
				if (authSet.contains(role)) {
					// 校验通过返回true, 否则拦截请求
					return true;
				}
			}
		}
		// TODO 拦截之后应该返回公共结果, 这里没做处理
		return true;
	}

}
